#include "base.h"

Base *readBase(FILE *base_file) 
{
	int i, j;
	int num_linhas;
	int num_colunas;
	int nClasses;
	double **data;
	double *fInfo;
	double x = 0;
			
	Base *b = (Base *) malloc(sizeof(Base));
	
	fscanf(base_file, "%d %d %d\n", &num_linhas, &num_colunas, &nClasses);

	/* Antes de comecar a ler a matriz de dados, tem que ler o vetor de relevancia dos atributos */	
	fInfo = (double *) malloc((num_colunas - 1) * sizeof(double));
	
	for(i = 0; i < num_colunas - 2; i++) 
	{
		
		fscanf(base_file, "%lf ", &fInfo[i]);
		if(fInfo[i] > x)
			x = fInfo[i]; //valor mais alto
	}

	fscanf(base_file, "%lf\n", &fInfo[i]);
	if(fInfo[i] > x)
		x = fInfo[i]; //valor mais alto

	//evitar divisao por zero
	if(x > 0) 
		for(i = 0; i < num_colunas - 1; i++)
			fInfo[i] = fInfo[i] / x; //proporcao ao valor mais alto
	
	data = (double **) malloc(num_linhas * sizeof(double *));
		
	for(i = 0; i < num_linhas; i++) 
	{
				
		data[i] = (double *) malloc(num_colunas * sizeof(double));
		
		/* Lendo os valores das features do dado corrente */
		for(j = 0; j < num_colunas - 1; j++) 
		{
						
			fscanf(base_file, "%lf ", &data[i][j]);			
		}
								
		/* Lendo a classe do dado corrente */
		fscanf(base_file, "%lf\n", &data[i][j]);	
	}
	
	b->database = data;
	b->nFeatures = num_colunas - 1;
	b->nData = num_linhas;
	b->nClasses = nClasses;
	b->fInfo = fInfo;
	
	return b;
}

//teste
void printBase(Base *b)
{
	int i, j;
	
	printf("%d nFeatures, %d nData\n", b->nFeatures, b->nData);
	printf("vetor de relevancia\n");
	
	for(i = 0; i < b->nFeatures; i++) 
	{
		
		printf("%f ", b->fInfo[i]);
	}
	
	printf("\n");
	printf("base (f0 fn c)\n");
	
	for(i = 0; i < b->nData; i++)
	{
		for(j = 0; j < b->nFeatures + 1; j++)
			printf("%lf ", b->database[i][j]);
		
		printf("\n");
	}
}
